// 给定一个整数数组 nums ，找出一个序列中乘积最大的连续子序列（该序列至少包含一个数）。

// 示例 1:

// 输入: [2,3,-2,4]
// 输出: 6
// 解释: 子数组 [2,3] 有最大乘积 6。
// 示例 2:

// 输入: [-2,0,-1]
// 输出: 0
// 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

#include <vector>

using namespace std;

class Solution1 {
public:
    int maxProduct(vector<int>& nums) {
        if (nums.empty()) return 0;
        int res = nums[0];
        int mn = nums[0];
        int mx = nums[0];
        int n = nums.size();
        for (int i{1}; i < n; ++i) {
            int tmax = mx;
            int tmin = mn;
            mx = max(max(nums[i], tmax*nums[i]), tmin*nums[i]);
            mn = min(min(nums[i], tmax*nums[i]), tmin*nums[i]);
            res = max(res, mx);
        }
        return res;
    }
};

class Solution2 {
public:
    int maxProduct(vector<int>& nums) {
        if (nums.empty()) return 0;
        int res = nums[0];
        int mn = nums[0];
        int mx = nums[0];
        int n = nums.size();
        for (int i{1}; i < n; ++i) {
            if (nums[i] > 0) { // 正数
                mx = max(mx*nums[i], nums[i]);
                mn = min(mn*nums[i], nums[i]);
            } else { // 负数
                int t = mx;
                mx = max(mn*nums[i], nums[i]);
                mn = min(t*nums[i], nums[i]);
            }
            res = max(res, mx);
        }
        return res;
    }
};

class Solution3 {
public:
    int maxProduct(vector<int>& nums) {
        if (nums.empty()) return 0;
        int res = nums[0];
        int mn = nums[0];
        int mx = nums[0];
        int n = nums.size();
        for (int i{1}; i < n; ++i) {
            if (nums[i] < 0) swap(mx, mn); // 遇到负数就把最大值最小值交换
            mx = max(mx*nums[i], nums[i]);
            mn = min(mn*nums[i], nums[i]);
            res = max(res, mx);
        }
        return res;
    }
};
